package com.stark.wechat.service.draft.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 图片消息
 */
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Accessors(chain = true)
@JsonPropertyOrder({"articleType", "title", "content", "needOpenComment", "onlyFansCanComment", "imageInfo", "coverInfo", "productInfo"})
public class NewspicArticles implements Articles {

    private static final long serialVersionUID = -5609066210656492661L;

    /**
     * 标题
     * <p>*必填
     */
    @NonNull
    @JsonProperty(required = true)
    private String title;

    /**
     * 图文消息的具体内容，支持HTML标签，必须少于2万字符，小于1M，且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。 图片消息则仅支持纯文本和部分特殊功能标签如商品，商品个数不可超过50个
     * <p>*必填
     */
    @NonNull
    @JsonProperty(required = true)
    private String content;

    /**
     * 是否打开评论，0不打开(默认)，1打开
     */
    @JsonProperty(defaultValue = "0")
    private Integer needOpenComment;

    /**
     * 是否粉丝才可评论，0所有人可评论(默认)，1粉丝才可评论
     */
    @JsonProperty(defaultValue = "0")
    private Integer onlyFansCanComment;

    /**
     * 图片消息里的图片相关信息，图片数量最多为20张，首张图片即为封面图
     * <p>*必填
     */
    @NonNull
    @JsonProperty(value = "image_info", required = true)
    private ImageInfo imageInfo;

    /**
     * 图片消息的封面信息
     */
    @JsonProperty("cover_info")
    private CoverInfo coverInfo;

    /**
     * 商品信息
     */
    @JsonProperty("product_info")
    private ProductInfo productInfo;

    @JsonProperty("article_type")
    @Override
    public ArticleType getArticleType() {
        return ArticleType.newspic;
    }

    /**
     * 图片消息的封面信息
     */
    @Data
    @Accessors(chain = true)
    public static class CoverInfo implements Serializable {

        private static final long serialVersionUID = 1726642051518784342L;

        /**
         * 封面裁剪信息
         */
        @JsonProperty("crop_percent_list")
        private List<CropPercent> cropPercentList = new ArrayList<>();

        /**
         * 添加裁剪百分比
         *
         * @param cropPercent 裁剪百分比信息
         * @return 当前对象
         */
        public CoverInfo addCropPercent(CropPercent cropPercent) {
            this.cropPercentList.add(cropPercent);
            return this;
        }

        /**
         * 封面裁剪信息。以图片左上角（0,0），右下角（1,1）建立平面坐标系，经过裁剪后的图片，其左上角所在的坐标填入x1，y1参数，右下角所在的坐标填入x2，y2参数
         */
        @Data
        @Accessors(chain = true)
        public static class CropPercent implements Serializable {

            private static final long serialVersionUID = -1513028304338722381L;

            /**
             * 裁剪比例，支持：“1_1”，“16_9”,“2.35_1”
             */
            private String ratio;

            /**
             * 以图片左上角（0,0），右下角（1,1）建立平面坐标系，经过裁剪后的图片，其左上角所在的坐标填入x1，y1参数
             */
            private String x1;

            /**
             * 以图片左上角（0,0），右下角（1,1）建立平面坐标系，经过裁剪后的图片，其左上角所在的坐标填入x1，y1参数
             */
            private String y1;

            /**
             * 以图片左上角（0,0），右下角（1,1）建立平面坐标系，经过裁剪后的图片，其右下角所在的坐标填入x2，y2参数
             */
            private String x2;

            /**
             * 以图片左上角（0,0），右下角（1,1）建立平面坐标系，经过裁剪后的图片，其右下角所在的坐标填入x2，y2参数
             */
            private String y2;

        }

    }

}
